import Vue from 'vue';
import VueRouter from 'vue-router';
import routes from './routes';
import store from "@/store";
Vue.use(VueRouter);
//把人家原型对象的push方法进行保存
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;
//VueRouter.prototype原型对象添加一个方法
//location:路由跳转相关的信息
VueRouter.prototype.push = function (location, resolve, reject) {
    //当前函数this：即为VueRouter类的实例
    //相当于push方法里面this，是windows【完犊子了】
    //利用人家push方法实现路由跳转，保证push里面this,应该vueRouter类的实例

    //面试:函数apply与call区别?
    //相同的地方:都可以篡改函数里面this
    //不同的地方:apply传递参数 数组  call传递参数 逗号分割

    if (resolve && reject) {
        //代表真:代表着两个形参接受参数【箭头函数】
        originPush.call(this, location, resolve, reject);
    } else {
        originPush.call(this, location, () => { }, () => { });
    }
}
VueRouter.prototype.replace = function (location, resolve, reject) {
    if (resolve && reject) {
        //代表真:代表着两个形参接受参数【箭头函数】
        originReplace.call(this, location, resolve, reject);
    } else {
        originReplace.call(this, location, () => { }, () => { });
    }
}

const router = new VueRouter({
    base: '/',
    mode: 'history',
    routes,
    scrollBehavior(to, from, savedPosition) {
        return { y: 0 } //表示垂直滚动条回到顶部
    }
});
export default router;

//全局守卫- 前置守卫 （任何路由的跳转都会执行）
router.beforeEach(async (to, from, next) => {
    //to：目标路由信息
    //from: 来自哪个路由的信息
    //next: 放行的函数  next();  next('/login') 放行到指定的路由，   next(false),不进行跳转    
    let userToken = store.state.user.userToken;
    let userName = store.state.user.userInfo.name;
    if (userToken) { //已经登录
        if (!userName) {
            try {
                await store.dispatch('getUserInfo'); //获取用户信息
            } catch (error) {
                await store.dispatch('postLogout');
                //应该是token过期了，因此需要重新登录
                return next('/login');
            }
        }
        if (to.path === '/login' || to.path === '/register') { //登录后不允许跳转到登录页和注册页
            return next('/home')
        }
    } else { //未登录
        if (to.path.indexOf("trade") != -1 || to.path.indexOf("pay") != -1 || to.path.indexOf("center") != -1) {
            return next('/login?redirect=' + to.path);
        }
    }
    next();
})


